import java.util.concurrent.CountDownLatch;

public class Demo31 {
    public static void main(String[] args) throws InterruptedException {
        // 构造方法中, 指定创建几个任务.
        CountDownLatch countDownLatch = new CountDownLatch(10);

        for (int i = 0; i < 10; i++) {
            final int id = i;
            new Thread(() -> {
                System.out.println("子线程" + id + "开始执行");
                try {
                    // 使用 sleep 代指某些耗时操作
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程" + id + "执行完毕");
                // 线程执行完毕, 调用 countDown 方法, 减1
                countDownLatch.countDown();
            }).start();
        }


        // 主线程如何知道上述所有的任务都完成了呢??
        // 难道要在主线程中调用 10 次 join 嘛?
        // 万一要是任务结束, 但是线程不需要结束, join 不就也不行了嘛?
        // 主线程中可以使用 countDownLatch 负责等待任务结束.
        // a => all 等待所有任务结束. 当调用 countDown 次数 < 初始设置的次数, await 就会阻塞.
        countDownLatch.await();
        System.out.println("所有任务执行完毕");
    }
}
